#ifndef OTABASE_H
#define OTABASE_H

#include <QtTypes>
#include <QByteArray>


namespace OTA {

#define 	HOST_ID		0x7E4A
#define 	BOOT_ID		0x7C5D

#define     OTA_PACK_LEN        (17)

#define  decrypt_passwd_2	{0xB7,0x6A}
#define  decrypt_passwd_6	{0x2E,0x78,0x05,0x9E,0x0F,0x4A}

// CRC32多项式
#define POLYNOMIAL 0xEDB88320L

// 功能码
typedef enum
{
    FUNC_CONNECT        = 0x02,    // 连接
    FUNC_COMFIRM_VER    = 0x03,	// 确认版本
    FUNC_DECRYPT_AUTH	= 0x10,	// 随机数、认证码
    FUNC_DECRYPT_RET	= 0x11,	// 返回数
    FUNC_UPDATE_MSG		= 0xA0,	// 更新信息
    FUNC_APP_LEN		= 0xA8,	// app长度
    FUNC_APP_BIN		= 0xA9,	// bin文件
    FUNC_CRC_4K			= 0xAC,	// 校验块
    FUNC_CRC_ALL		= 0xAD,	// 校验所有
    FUNC_JUMP_APP		= 0xB1,	// 跳转APP
    FUNC_TERMINATE		= 0xB2,	// 终止更新
}OTA_func;

enum OTA_STEP
{
    STEP_COMFIRM_VER,
    STEP_COMFIRM_VER_CHECK,
    STEP_DECRYPT_AUTH,
    STEP_DECRYPT_AUTH_CHECK,
    STEP_DECRYPT_RET,
    STEP_DECRYPT_RET_CHECK,
    STEP_UPDATE_MSG_APPVER,  // 更新APP版本
    STEP_UPDATE_MSG_APPVER_CHECK,
    STEP_UPDATE_MSG_OPLEN, // 发送操作员长度
    STEP_UPDATE_MSG_OPLEN_CHECK,
    STEP_UPDATE_MSG_OP, // 操作员信息
    STEP_UPDATE_MSG_OP_CHECK,
    STEP_APP_LEN,
    STEP_APP_LEN_CHECK,
    STEP_APP_BIN,
    STEP_APP_BIN_CHECK,
    STEP_CRC_4K,
    STEP_CRC_4K_CHECK,
    STEP_CRC_ALL,
    STEP_CRC_ALL_CHECK,
    STEP_JUMP_APP,
    STEP_JUMP_APP_CHECK,
    STEP_TERMINATE,
    STEP_TERMINATE_CHECK,
};

}


class OTABase
{
public:
    OTABase();
    ~OTABase();

protected:
    void initCRC32Table(void);
    quint32 CRC32(QByteArray& byteArr);
    quint32 CRC32(const void *data, size_t size);
    quint32 CRC32Only(QByteArray& byteArr);
    quint16 sumCheck(QByteArray& byteArr);
    quint16 sumCheckOnly(QByteArray& byteArr);
    quint16 sumCheck(const void* data, size_t length);
    void createHostPackage(QByteArray& byteArr);
    void createHostPackage(QByteArray &byteArr,
                                    quint8 data_len,
                                    OTA::OTA_func func);
};

#endif // OTABASE_H
